
#include "matrix.h"

/*
 * Affiche la matrice
 */
void printMatrix(Matrix* matrix)
{
    int i = 0, j = 0;
    
    // Première ligne
    printf("  ");
    for(i = 0;i < matrix->size;i++)
        printf("%c ", i + 'A');
    
    printf("\n");
    
    
    for(i = 0; i < matrix->size;i++)
    {
        printf("%c ", i + 'A');
        for(j; j < matrix->size; j++)
        {
            printf("%d ", matrix->table[i][j]);
        }
        j = 0;
        printf("\n");
    }
    printf("\n");
} //printMatrix




/*------------------------------------------*/

/*
 * Gestion des Arêtes
 */

/*
 * Ajoute une arête entre le sommet A et le sommet B dans la matrice
 * Retour : retourne 0 s'il y a une erreur, sinon -> 1
 */
int matrix_addVertex(int nodeA, int nodeB, Matrix* matrix)
{
    if((nodeA < 0 || nodeA >= matrix ->size) || (nodeB < 0 || nodeB >= matrix ->size))
        return 0;
    
    matrix->table[nodeA][nodeB] = 1;
    matrix->table[nodeB][nodeA] = 1;
    
    return 1;
} //addVertex

/*
 * Retire une arête entre le sommet A et le sommet B dans la matrice
 * Retour : retourne 0 s'il y a une erreur, sinon -> 1
 */
int matrix_removeVertex(int nodeA, int nodeB, Matrix* matrix)
{
    if((nodeA < 0 || nodeA >= matrix ->size) || (nodeB < 0 || nodeB >= matrix ->size))
        return 0;
    
    matrix->table[nodeA][nodeB] = 0;
    matrix->table[nodeB][nodeA] = 0;
    
    return 1;
} //removeVertex

/*
 * Vérifie l'existance d'une arête entre deux sommets
 */
int matrix_existVertex(int nodeA, int nodeB, Matrix* matrix)
{
        if((nodeA < 0 || nodeA >= matrix ->size) || (nodeB < 0 || nodeB >= matrix ->size))
        return 0;
        
        int res = 0;
        
        if(matrix->table[nodeA][nodeB] == 1)
            res = 1;
        
        if(res == 1 && matrix->table[nodeB][nodeA] != 1)
            res = 0;
        
        return res;
}
/*------------------------------------------*/

/*
 * Gestion des Sommets
 */

/*
 * Ajoute un sommet en fin de matrice
 */
int matrix_addNode(Matrix *matrix)
{
    int size = matrix->size;
    int i, j;
    int **newTab = matrix_createTable(size + 1);
    
    matrix_cloneTable(matrix->table, newTab, size);
    
    matrix -> table = newTab;

    matrix->size = size + 1;
    
    return 1;
}

/*
 * Enlève un sommet à la matrice
 * Retour : retourne 0 s'il y a une erreur, sinon -> 1
 */
int matrix_removeNode(int nodePosition, Matrix* matrix)
{
    if((nodePosition < 0 || nodePosition >= matrix ->size))
        return 0;
    
    int size = matrix -> size - 1;
    int oldSize = matrix -> size;
    int i,j,k=0,l=0;
    int **newTab = matrix_createTable(size);
    
    for(i=0; i < oldSize; i++)
    {
        if(i != nodePosition)
        {
            for(j=0; j < oldSize; j++)
            {
                if(j != nodePosition)
                        newTab[k][l++] = matrix->table[i][j];
            }
            k++;
            l = 0;
        }
    }
    
    matrix->table = newTab;
   
    matrix->size = size;
    
    return 1;
}


/*------------------------------------------*/

/*
 * Gestion des Tableaux
 */

// Créer un tableau d'allocation dynamique
int** matrix_createTable(int size)
{
    int i, j;
    int **tab = malloc (size * sizeof(int*));
    for (i=0; i<size; i++)
    {
        tab[i] = (int*) malloc (size * sizeof (int) );
    }
    
    for(i = 0; i<size; i++)
    {
        for(j = 0; j<size; j++)
        {
            tab[i][j] = 0;
        }
    }
    
    return tab;
}

void matrix_cloneTable(int **source, int** target, int size)
{
    int i,j;
    
    for(i = 0; i < size; i++)
    {
        for(j = 0; j < size; j++)
            target[i][j] = source[i][j];
    }
    
    return target;
}